package com.evan.alip7.lock;

import com.evan.alip7.lock.entity.Phone;

import java.util.concurrent.TimeUnit;

/**
 * @author huangzhongliang
 * @time 2023/09/09 17:25
 */
public class P31Lock8Demo {
    /**
     * 现象描述：
     * 1 标准访问ab两个线程，请问先打印邮件还是短信？ --------先邮件，后短信  共用一个对象锁
     * 2. sendEmail钟加入暂停3秒钟，请问先打印邮件还是短信？---------先邮件，后短信  共用一个对象锁
     * 3. 添加一个普通的hello方法，请问先打印普通方法还是邮件？ --------先hello，再邮件
     * 4. 有两部手机，请问先打印邮件还是短信？ ----先短信后邮件  资源没有争抢，不是同一个对象锁
     * 5. 有两个静态同步方法，一步手机， 请问先打印邮件还是短信？---------先邮件后短信  共用一个类锁
     * 6. 有两个静态同步方法，两部手机， 请问先打印邮件还是短信？ ----------先邮件后短信 共用一个类锁
     * 7. 有一个静态同步方法 一个普通同步方法，请问先打印邮件还是短信？ ---------先短信后邮件   一个用类锁一个用对象锁
     * 8. 有一个静态同步方法，一个普通同步方法，两部手机，请问先打印邮件还是短信？ -------先短信后邮件 一个类锁一个对象锁
     */

    /**
     * ● 对于普通同步方法，锁的是当前实例对象，通常指this，所有的同步方法用的都是同一把锁--->实例对象本身
     * ● 对于静态同步方法，锁的时当前类的Class对象 如Phone.class唯一一个模板
     * ● 对于同步方法块，锁的时synchronized括号内的对象
     */
    public static void main(String[] args) {

        Phone phone = new Phone();
        Phone phone2 = new Phone();
        new Thread(() -> phone.sendEmail(), "a").start();
        try {
            TimeUnit.MILLISECONDS.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(() -> phone2.sendSMS(), "b").start();
    }
}
